#pragma once
#include "mysql.h"
#include <string>
#include <queue>
#include <mutex>
using namespace std;

// 数据库连接池 饿汉单例模式   线程安全
class ConnectionPool
{
private:
    // 单例模式,构造函数私有化,保证不在类的外部实例化
    ConnectionPool();

public:
    ~ConnectionPool();
    // 获取实例
    static ConnectionPool *getInstance()
    {
        return globalInstance;
    }
    // 初始化连接池
    bool init(const string &host, const string &user, const string &pwd, const string &dbName, int poolSize = 10, int port = 3306);
    // 获取一个mysql连接对象
    MYSQL *getConnObj();
    // 回收一个mysql连接对象
    void recycleConnObj(MYSQL *conn);
    // 关闭连接池
    void closePool();

private:
    static ConnectionPool *globalInstance; // 全局唯一实例
    mutex m_mutex;                         // 互斥量
    queue<MYSQL *> connQue;                // mysql连接对象队列
    int m_poolSize;                        // 线程池的最大容量
};